<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script>
            class Person {
                name = "孙悟空"
                age = 18

                sayHello() {
                    console.log("Hello，我是", this.name)
                }
            }

            const p = new Person()

            // console.log(p)

            /* 
                访问一个对象的原型对象
                    对象.__proto__
                    Object.getPrototypeOf(对象)

                原型对象中的数据：
                    1. 对象中的数据（属性、方法等）
                    2. constructor （对象的构造函数）

                注意：
                    原型对象也有原型，这样就构成了一条原型链，根据对象的复杂程度不同，原型链的长度也不同
                        p对象的原型链：p对象 --> 原型 --> 原型 --> null
                        obj对象的原型链：obj对象 --> 原型 --> null

                    原型链：
                        - 读取对象属性时，会优先对象自身属性，
                            如果对象中有，则使用，没有则去对象的原型中寻找
                            如果原型中有，则使用，没有则去原型的原型中寻找
                            直到找到Object对象的原型（Object的原型没有原型（为null））
                                如果依然没有找到，则返回undefined

                        - 作用域链，是找变量的链，找不到会报错
                        - 原型链，是找属性的链，找不到会返回undefined
            
            */
            // console.log(p.__proto__.__proto__.__proto__)
            // console.log(p.constructor)

            // console.log(Object.getPrototypeOf(p) === p.__proto__)

            const obj = {} // obj.__proto__

            


        </script>
    </head>
    <body></body>
</html>
